package cn.tx.service.impl;

import cn.tx.constant.RedisMessageConstant;
import cn.tx.mapper.MemberDao;
import cn.tx.mapper.OrderDao;
import cn.tx.mapper.OrderSettingDao;
import cn.tx.pojo.Member;
import cn.tx.pojo.Order;
import cn.tx.pojo.OrderSetting;
import cn.tx.service.OrderService;
import com.alibaba.dubbo.config.annotation.Service;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.transaction.annotation.Transactional;

import java.util.Date;
import java.util.List;

/**
 * @author Snake Eyes
 * @PROJECT_NAME: health_parent
 * @DESCRIPTION:
 * @USER: 11647
 * @DATE: 2021/9/5 23:11
 * @Email: 1164763541@qq.com
 */
@Service(interfaceClass = OrderService.class)
@Transactional
public class OrderServiceImpl implements OrderService {
    @Autowired
    private OrderDao orderDao;

    @Autowired
    private RedisTemplate template;
    @Autowired
    private OrderSettingDao orderSettingDao;
    @Autowired
    private MemberDao memberDao;

    /**
     * @author :11647
     * @date ：Created in 2021/9/6  16:14
     * @description：(描述) 体检预约保存方法
     * 1、检查用户所选择的预约日期是否已经提前进行了预约设置，如果没有设置则无法进行预约
     * <p>
     * 2、检查用户所选择的预约日期是否已经约满，如果已经约满则无法预约
     * <p>
     * 3、检查用户是否重复预约（同一个用户在同一天预约了同一个套餐），如果是重复预约则无法完成再次预约
     * <p>
     * 4、检查当前用户是否为会员，如果是会员则直接完成预约，如果不是会员则自动完成注册并进行预约
     * <p>
     * 5、预约成功，更新当日的已预约人数
     * @modified By：11647
     * @version:
     */

    @Override
    public void save(Order order, Member member, String validateCode) {
        //查询验证码
        String code = (String) template.boundValueOps(member.getPhoneNumber() + RedisMessageConstant.SENDTYPE_ORDER).get();
        //判断验证码是否存在以及是否正确
        if (code != null && code.equals(validateCode)) {
            //检查用户所选择的预约日期是否已经提前进行了预约设置，如果没有设置则无法进行预约
            OrderSetting orderSetting = orderSettingDao.selectFindByDate(order.getOrderDate());
            if (orderSetting != null) {
                //检查用户所选择的预约日期是否已经约满，如果已经约满则无法预约
                if (orderSetting.getNumber() == orderSetting.getReservations()) {

                    return;
                } else {
                    //检查用户是否重复预约（同一个用户在同一天预约了同一个套餐），如果是重复预约则无法完成再次预约
                    //获取到会员id 和套餐id
                    Integer memberId = order.getMemberId();
                    Integer setmealId = order.getSetmealId();

                    if (memberId != null) {
                        List<OrderSetting> lists = orderSettingDao.findByMemberId(memberId);
                        for (OrderSetting list : lists) {
                            if (setmealId.equals(list)) {
                                return;
                            } else {
                                //修改数据
                                list.setReservations(list.getReservations() + 1);
                                //存入数据库
                                orderSettingDao.update(list);
                            }
                        }
                    } else {
                        //检查当前用户是否为会员，如果是会员则直接完成预约，如果不是会员则自动完成注册并进行预约
                        if (memberId != null) {
                            Member member1 = memberDao.selectByCondition(memberId);
                            if (member1 != null) {
                                //完成预约
                                order.setMemberId(member1.getId());
                                orderDao.save(order);
                            } else {

                                member.setRegTime(new Date());
                                //创建会员
                                memberDao.save(member);
                                //预约
                                order.setMemberId(member.getId());

                            }
                        }
                    }
                }
            } else {
                System.out.println("验证码不存在");
                return;
            }
        }
    }
}
